# SPDX-License-Identifier: GPL-2.0
if BLOCK

menu "IO Schedulers"

config IOSCHED_NOOP
	bool
	default y
	---help---
	  The no-op I/O scheduler is a minimal scheduler that does basic merging
	  and sorting. Its main uses include non-disk based block devices like
	  memory devices, and specialised software or hardware environments
	  that do their own scheduling and require only minimal assistance from
	  the kernel.

config IOSCHED_DEADLINE
	tristate "Deadline I/O scheduler"
	default y
	---help---
	  The deadline I/O scheduler is simple and compact. It will provide
	  CSCAN service with FIFO expiration of requests, switching to
	  a new point in the service tree and doing a batch of IO from there
	  in case of expiry.

config IOSCHED_MAPLE
	tristate "Maple I/O scheduler"
	default y

config IOSCHED_CFQ
	tristate "CFQ I/O scheduler"
	default y
	---help---
	  The CFQ I/O scheduler tries to distribute bandwidth equally
	  among all processes in the system. It should provide a fair
	  and low latency working environment, suitable for both desktop
	  and server systems.

	  This is the default I/O scheduler.

config IOSCHED_FIOPS
	tristate "IOPS based I/O scheduler"
	default y
	---help---
	  This is an IOPS based I/O scheduler. It will try to distribute
          IOPS equally among all processes in the system. It's mainly for
          Flash based storage.

config IOSCHED_SIO
	tristate "Simple I/O scheduler"
	default y
	---help---
	  The Simple I/O scheduler is an extremely simple scheduler,
	  based on noop and deadline, that relies on deadlines to
	  ensure fairness. The algorithm does not do any sorting but
	  basic merging, trying to keep a minimum overhead. It is aimed
	  mainly for aleatory access devices (eg: flash devices).

config CFQ_GROUP_IOSCHED
	bool "CFQ Group Scheduling support"
	depends on IOSCHED_CFQ && BLK_CGROUP
	default n
	---help---
	  Enable group IO scheduling in CFQ.

config IOSCHED_ZEN
	tristate "Zen I/O scheduler"
	default y
	---help---
	  FCFS, dispatches are back-inserted, deadlines ensure fairness.
	  Should work best with devices where there is no travel delay.

choice

	prompt "Default I/O scheduler"
	default DEFAULT_CFQ
	help
	  Select the I/O scheduler which will be used by default for all
	  block devices.

	config DEFAULT_DEADLINE
		bool "Deadline" if IOSCHED_DEADLINE=y

	config DEFAULT_CFQ
		bool "CFQ" if IOSCHED_CFQ=y

	config DEFAULT_NOOP
		bool "No-op"

	config DEFAULT_SIO
		bool "SIO" if IOSCHED_SIO=y

	config DEFAULT_FIOPS
		bool "FIOPS" if IOSCHED_FIOPS=y

	config DEFAULT_ZEN
		bool "ZEN" if IOSCHED_ZEN=y
		
	config DEFAULT_MAPLE
		bool "Maple" if IOSCHED_MAPLE=y

endchoice

config DEFAULT_IOSCHED
	string
	default "deadline" if DEFAULT_DEADLINE
	default "cfq" if DEFAULT_CFQ
	default "noop" if DEFAULT_NOOP
	default "fiops" if DEFAULT_FIOPS
	default "sio" if DEFAULT_SIO
	default "zen" if DEFAULT_ZEN
	default "maple" if DEFAULT_MAPLE

config MQ_IOSCHED_DEADLINE
	tristate "MQ deadline I/O scheduler"
	default y
	---help---
	  MQ version of the deadline IO scheduler.

config MQ_IOSCHED_KYBER
	tristate "Kyber I/O scheduler"
	default y
	---help---
	  The Kyber I/O scheduler is a low-overhead scheduler suitable for
	  multiqueue and other fast devices. Given target latencies for reads and
	  synchronous writes, it will self-tune queue depths to achieve that
	  goal.

config IOSCHED_BFQ
	tristate "BFQ I/O scheduler"
	default n
	---help---
	BFQ I/O scheduler for BLK-MQ. BFQ distributes the bandwidth of
	of the device among all processes according to their weights,
	regardless of the device parameters and with any workload. It
	also guarantees a low latency to interactive and soft
	real-time applications.  Details in
	Documentation/block/bfq-iosched.txt

config BFQ_GROUP_IOSCHED
       bool "BFQ hierarchical scheduling support"
       depends on IOSCHED_BFQ && BLK_CGROUP
       default n
       ---help---

       Enable hierarchical scheduling in BFQ, using the blkio
       (cgroups-v1) or io (cgroups-v2) controller.

endmenu

endif
